package com.hsgene.order.service;

import com.hsgene.common.ClientType;
import com.hsgene.common.dto.CommonDictDto;
import com.hsgene.common.util.result.ApiResult;
import com.hsgene.common.util.result.NullObject;
import com.hsgene.common.util.support.LimitHelper;
import com.hsgene.common.util.support.OrderHelper;
import com.hsgene.common.util.support.Pagination;
import com.hsgene.mq.DcwImageModel;
import com.hsgene.order.condition.GeneticTestingOrderCondition;
import com.hsgene.order.domain.OrderPackageDetail;
import com.hsgene.order.domain.disease.GeneOrder;
import com.hsgene.order.domain.v1.GeneticOrderOperationDetail;
import com.hsgene.order.domain.v1.GeneticTestingExpressDelivery;
import com.hsgene.order.domain.v1.GeneticTestingOrder;
import com.hsgene.order.domain.v1.GeneticTestingOrderAddtionB;
import com.hsgene.order.dto.console.OrderUpdateRealPriceDto;
import com.hsgene.order.dto.doctor.DoctorOrderDto;
import com.hsgene.order.dto.doctor.DoctorOrderItemDto;
import com.hsgene.order.dto.doctor.OrderLogisticsInfoDto;
import com.hsgene.order.dto.doctor.OrderProductLogisticsInfoDto;
import com.hsgene.order.dto.peanut.*;
import com.hsgene.order.dto.v1.OrderConfirmReceiptDto;
import com.hsgene.order.dto.v1.UploadDcwDetailsDto;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 订单Service
 *
 * @author wangbing
 * @version 1.0, 2018/9/18
 */
public interface OrderService {

    /**
     * @param orderId 订单id
     * @return int
     * @description 获取患者信息确认状态
     * @author maodi
     * @createDate 2018/10/31 9:18
     */
    Integer getPatientInfoConfirm(String orderId);

    /**
     * 查询地服关联订单列表
     *
     * @param condition   查询条件
     * @param orderHelper 排序参数
     * @param limitHelper 分页参数
     * @return 查询结果
     */
    ApiResult<Pagination<PeanutOrderItemDto>> queryServantTestingOrder(
            GeneticTestingOrderCondition condition, OrderHelper orderHelper, LimitHelper limitHelper);

    /**
     * 查询医生关联订单列表
     *
     * @param doctorId    医生id
     * @param appStatus   APP状态
     * @param keyWord     搜索关键字
     * @param limitHelper 分页参数
     * @return 查询结果
     */
    ApiResult<List<DoctorOrderItemDto>> queryDoctorTestingOrder(
            String doctorId, String appStatus, String keyWord, LimitHelper limitHelper);

    /**
     * 查询地服关联的指定订单id的详情
     *
     * @param groundServantId 地服id
     * @param orderId         订单id
     * @return 订单详情
     */
    ApiResult<PeanutOrderDto> findServantTestingOrder(String groundServantId, String orderId);

    /**
     * 查询医生关联的指定订单编号的详情
     *
     * @param doctorId 医生id
     * @param orderId  订单id
     * @return 订单详情
     */
    ApiResult<DoctorOrderDto> findDoctorTestingOrder(String doctorId, String orderId);

    /**
     * 完善订单信息
     *
     * @param orderInfo 订单完善信息
     * @param date      更新时间
     * @return
     */
    ApiResult completeOrder(ReserveOrderCompleteInfo orderInfo, Date date);

    /**
     * 地服创建订单
     *
     * @param orderInfo  订单信息
     * @param updateTime 时间
     * @return
     */
    ApiResult createOrder(DifuCreateOrderInfoDto orderInfo, Date updateTime);

    /**
     * 线上支付成功后，支付回调信息处理（注：支付金额以元为单位）
     *
     * @param paymentNo      支付单号
     * @param paymentAmount  支付金额（单位：元）
     * @param paymentChannel 支付渠道(1-支付宝,2-微信,3-银联)
     * @return 处理结果
     */
    String handlePaymentNotice(String paymentNo, BigDecimal paymentAmount, Integer paymentChannel);

    /**
     * 线下付款弹窗信息
     *
     * @param id 订单id
     * @return
     */
    ApiResult underLinePaymentInfo(String id);

    /**
     * 保存线下收款填写的信息并更改订单状态
     *
     * @param geneticTestingOrderAddtionB
     * @return
     */
    ApiResult updateTestingOrder(GeneticTestingOrderAddtionB geneticTestingOrderAddtionB);

    /**
     * 地服完善信息
     *
     * @param difuCompete 完善信息对象
     * @param userId
     */
    String difuComplete(DifuCompeteOrderInfoDto difuCompete, String userId);

    /**
     * @param id           订单id
     * @param cancelReason 取消原因
     * @param cancelType   取消类型
     * @return void
     * @description 取消基因检测单
     * @author maodi
     * @createDate 2018/9/29 10:04
     */
    void cancelOrder(String id, String cancelReason, Integer cancelType);

    /**
     * 计算佣金
     *
     * @param paramDto 参数
     * @return
     */
    OrderCommissionInfo calculateCommission(CalculateCommissionParamDto paramDto);

    /**
     * @param orderId 订单id
     * @return com.hsgene.order.dto.peanut.BaseInfoDataDto
     * @description 获取基因检测单基础信息
     * @author maodi
     * @createDate 2018/9/29 15:27
     */
    BaseInfoDataDto getBaseInfoById(String orderId);

    /**
     * 同步检测单信息
     *
     * @param orderId 检测单ID
     */
    void synTestOrder(String orderId);

    /**
     * 上传dcw
     *
     * @param testingOrder dcw信息
     */
    ApiResult uploadDcw(UploadDcwDetailsDto testingOrder);

    /**
     * 申请录入
     *
     * @param orderId 订单id
     * @return
     */
    ApiResult applicationEntry(String orderId);

    /**
     * 确认签收信息
     *
     * @param receiptDto 确认签收
     * @return
     */
    ApiResult confirmReceipt(OrderConfirmReceiptDto receiptDto);

    /**
     * 根据id获取检测申请单信息（花生仁）
     *
     * @param requistionId 申请单id
     * @return
     */
    ApiResult requistions(String requistionId);

    /**
     * 根据基因检测单id获取检测申请单信息列表
     *
     * @param orderId 订单id
     * @param orgIds  检测机构ids(逗号分隔)
     * @return 检测申请单信息列表
     */
    ApiResult<List<OrderRequisitionDto>> getRequisitionInfoByOrderId(String orderId, String orgIds);

    /**
     * 基因检测单套餐变更记录分页查询
     *
     * @param groundServantId 地服id
     * @param pageNo          页码
     * @param pageSize        分页大小(默认值:10)
     * @return 查询结果
     */
    ApiResult<Pagination<OrderInterchangeListDto>> pageInterchange(String groundServantId, int pageNo, int pageSize);

    /**
     * 查询基因检测单套餐变更记录信息
     *
     * @param interchangeId 变更记录id
     * @return 基因检测单套餐变更记录信息
     */
    ApiResult<OrderInterChangeDetailDto> interChangeInfo(String interchangeId);

    /**
     * 基因检测单收款(地服代付: confirm_order_cheques)
     *
     * @param orderRequest 基因检测单收款(地服代付请求信息)
     * @return 支付信息
     */
    ApiResult<String> difuPayProcessOrder(TestingOrderRequestDto orderRequest);

    /**
     * 套餐变更补款付款
     *
     * @param interChangeId 变更id
     * @param payMethod     支付方式
     * @return 支付信息
     */
    ApiResult<String> interChangeRepaid(String interChangeId, String payMethod);

    /**
     * 更新报告状态
     *
     * @param orderPackageDetail
     * @return
     */
    ApiResult updateReportStatus(OrderPackageDetail orderPackageDetail);

    /**
     * @param id 订单id
     * @return void
     * @description 根据订单id确认患者信息
     * @author maodi
     * @createDate 2018/10/8 11:18
     */
    void updatePatientInfoConfirm(String id);

    /**
     * @param orderNo 订单号
     * @return com.hsgene.order.domain.disease.GeneOrder
     * @description 获取患者确认信息
     * @author maodi
     * @createDate 2018/9/30 15:43
     */
    GeneOrder getPatientInfoConfirmByOrderNo(String orderNo);

    /**
     * @param id 订单id
     * @return java.lang.String
     * @description 根据订单id获取患者电话
     * @author maodi
     * @createDate 2018/9/30 16:00
     */
    String getPatientPhoneById(String id);

    String getTestItemsByOrderNo(String orderNo);

    /**
     * 订单状态校验
     *
     * @param orderId 订单id
     * @param status  订单状态
     * @return
     */
    Integer checkOrderStatus(String orderId, Integer status);

    /**
     * 获取医生id
     *
     * @param orderId
     * @return
     */
    String checkDoctorInfo(String orderId);

    /**
     * 查询订单套餐物流信息
     *
     * @param orderId   订单id
     * @param productId 套餐id
     * @return
     */
    OrderProductLogisticsInfoDto getOrderProductLogistics(String orderId, String productId);

    /**
     * 获取订单物流详情
     *
     * @param orderId 订单id
     * @return
     */
    List<OrderLogisticsInfoDto> getLogisticsDetail(String orderId);

    /**
     * 查询医生关订单的报告名称对应的报告地址
     *
     * @param doctorId   医生id
     * @param reportName 报告名称
     * @return 报告地址
     */
    ApiResult<String> queryOrderPackageReport(String doctorId, String reportName);

    /**
     * 查询订单相关的字典枚举
     *
     * @param clientType 客户端类型
     * @param type       字典枚举类型
     * @return 关联字典枚举列表
     */
    Map<String, List<CommonDictDto>> queryDict(ClientType clientType, String type);

    /**
     * 查询dcw信息
     *
     * @param orderId 订单id
     * @return
     */
    DcwImageModel getDcwInfos(String orderId);

    /**
     * 校验样本类型所填参数
     *
     * @param sampleId 样本id
     * @return
     */
    String checkParamsIsNull(String sampleId);

    /***
     * 订单操作记录
     * @author jcl
     * @date 2018/11/13 9:53
     * @param geneticOrderOperationDetail
     * @return
     */
    void orderOperationLog(GeneticOrderOperationDetail geneticOrderOperationDetail);

    /**
     * 校验积分发放
     *
     * @param orderId 订单id
     * @return
     */
    Integer checkPointSend(String orderId);

    /**
     * 校验订单是否发放积分
     *
     * @param orderId 订单id
     * @return
     */
    Integer checkPointSendStatus(String orderId);

    /**
     * 发放积分
     *
     * @param orderId 订单id
     */
    Boolean sendPoint(String orderId);

    /**
     * @param orderNo 订单编号
     * @return com.hsgene.order.domain.v1.GeneticTestingOrder
     * @description 根据订单编号查询订单
     * @author maodi
     * @createDate 2018/11/13 14:25
     */
    GeneticTestingOrder findByOrderNo(String orderNo);

    /**
     * @param orderId 订单id
     * @return void
     * @description 更新主订单为待发货
     * @author maodi
     * @createDate 2018/11/13 16:18
     */
    void updateMainOrderDelivery(String orderId);

    /**
     * 地服确认发货
     *
     * @param expressDelivery
     * @return
     * @author FX
     * @date 2018/11/14 11:31
     */
    ApiResult groundDelivery(GeneticTestingExpressDelivery expressDelivery);

    /**
     * @param orderId 订单id
     * @param userId  用户id
     * @return void
     * @description 订单奖励标记状态改为已奖励，修改更新时间，修改A表更新时间
     * @author maodi
     * @createDate 2018/11/26 15:04
     */
    void awarded(String orderId, String userId);

    /**
     * @param orderId 订单id
     * @return com.hsgene.order.dto.console.OrderUpdateRealPriceDto
     * @description 根据订单id查询修改实际价格信息
     * @author maodi
     * @createDate 2018/11/28 10:44
     */
    OrderUpdateRealPriceDto queryUpdateRealPriceDto(String orderId);

    /**
     * @param orderId        订单id
     * @param packageCharges 套餐价格字符串数组
     * @param realCharges    订单套餐实际价格字符串数组
     * @param packageIds     套餐id数组
     * @param userId         用户id
     * @return
     * @description 修改订单套餐实际价格
     * @author maodi
     * @createDate 2018/11/28 10:46
     */
    void updatePackageCharges(String orderId, String[] packageCharges, String[] realCharges, String[] packageIds, String
            userId);

    /**
     * @param orderId 订单id
     * @return java.lang.Integer
     * @description 根据订单id查询订单来源
     * @author maodi
     * @createDate 2018/11/28 11:10
     */
    Integer queryOrderOrigin(String orderId);

    /**
     * @param dto 订单信息
     * @return com.hsgene.common.util.result.ApiResult
     * @description 花生仁确认订单
     * @author maodi
     * @createDate 2018/12/19 14:06
     */
    ApiResult peanutConfirmOrder(PeanutCreateAndConfirmOrderDto dto);

    /**
     * @param dto 订单信息
     * @return com.hsgene.common.util.result.ApiResult
     * @description 花生仁下单
     * @author maodi
     * @createDate 2018/12/19 14:06
     */
    ApiResult peanutCreateOrder(PeanutCreateAndConfirmOrderDto dto);

    /**
     * 处理订单半小时未支付消息
     *
     * @param orderNo 订单编号
     * @return 操作结果
     */
    ApiResult<NullObject> handleOrderNonePaidMsg(String orderNo);

    /**
     * 处理订单半小时未支付消息
     *
     * @param orderNo 订单编号
     * @return 操作结果
     */
    ApiResult<NullObject> handleOrderAutoCloseMsg(String orderNo);

    /**
     * 处理套餐变更
     *
     * @param interchange 套餐变更信息
     * @param difuId      地服id
     * @return 地服操作处理变更结果
     */
    ApiResult<String> completeInterchange(GeneOrderInterchange interchange, String difuId);

    /**
     * 订单是否付款
     *
     * @param orderId 订单id
     * @return
     */
    Integer checkOrderIsPay(String orderId);

    /**
     * 患者付款后确认
     *
     * @param confirmedInfo 确认信息
     */
    void updateOrderTestInfo(PatientConfirmedInfo confirmedInfo);

    /**
     * 删除订单
     *
     * @param orderId 订单id
     */
    void deleteOrderId(String orderId);

    /**
     * 获取订单来源
     *
     * @param orderId
     * @return
     */
    Integer getOrderSource(String orderId);

    /**
     * 获取pdf信息
     *
     * @param orderId 订单id
     * @return
     */
    List<GeneTestPdfInfo> getTestPdf(String orderId);

    /**
     * 获取患者展示信息
     *
     * @param orderId 订单id
     * @return
     */
    GeneticTestPatientShowInfo getOrderDetailsByOrderId(String orderId);

    /**
     * @param orderId 订单id
     * @return com.hsgene.order.domain.v1.GeneticTestingOrder
     * @description 根据订单id查找订单信息
     * @author maodi
     * @createDate 2019/1/17 10:02
     */
    GeneticTestingOrder findById(String orderId);

    /**
     * 校验状态是否有效
     *
     * @param orderId 订单id
     * @param status  状态值
     * @return
     */
    Integer checkOrderStatusIsEffect(String orderId, Integer... status);

    /**
     * 判断订单是否标记
     *
     * @param orderId 订单id
     * @return
     */
    Integer checkOrderIsSign(String orderId);

    /**
     * @param orderId 订单id
     * @return java.lang.Integer
     * @description 校验订单状态是否在待地管确认、待确认样本、报告待上传、报告待审核状态之间
     * @author maodi
     * @createDate 2019/1/28 14:19
     */
    Integer checkSecondPerfectOrderStatus(String orderId);

    /**
     * @param orderId 订单id
     * @return java.lang.String
     * @description 获取订单快递图片
     * @author maodi
     * @createDate 2019/2/20 13:42
     */
    String selectCourierImagesUrl(String orderId);

    /**
     * @param orderId 订单id
     * @return
     * @description 查询订单快递公司是否为空
     * @author maodi
     * @createDate 2019/2/20 14:05
     */
    List<String> selectCourierCompanyName(String orderId);

    /**
     * @param orderId 订单id
     * @return com.hsgene.order.dto.peanut.OrderCheckInfoDto
     * @description 快递回单、样本图片是否为空
     * @author maodi
     * @createDate 2019/2/20 16:51
     */
    OrderCheckInfoDto checkOrderSample(String orderId);

    /**
     * @param orderId 订单id
     * @return com.hsgene.order.dto.peanut.OrderCheckInfoDto
     * @description 验证快递公司，快递时间，快递备注，快递单号是否为空
     * @author maodi
     * @createDate 2019/2/20 16:51
     */
    OrderCheckInfoDto checkPackageDeliver(String orderId);
}
